#include <iostream>
#include <string>

#include <signal.h>

#include "../Comm/httplib.h"
#include "oj_ctrl.hpp"

static ns_control::Control* pctrl;
void Handler(int sign)
{
    pctrl->ReStart();
    std::cout << "所有离线主机已上线" << std::endl;
}
int main()
{
    // 收到SIGINT信号，就会上线所有离线的主机
    signal(SIGQUIT, Handler);

    //建立网络服务(基于http、TCP协议)
    httplib::Server server;
    //设置不同请求信息的不同处理方法的结果
    ns_control::Control ctrl;
    pctrl = &ctrl;

// 浏览器请求分为四种
    // 1. 获取所有的题目列表
    server.Get
    (
        "/questions",
        [&ctrl](const httplib::Request& req, httplib::Response& resp)
        {
            std::string html;
            ctrl.Questions(html);
            resp.set_content(html, "text/html;charset=utf-8");
        }
    );
    // 2. 获取题目内容
    server.Get
    (
        // (\d+) -> 正则表达式，可以自动匹配我们所选择的题号
        // R"()" -> 忽略字符串中的特殊字符，保持字符串原貌
        R"(/questions/(\d+))",
        [&ctrl](const httplib::Request& req, httplib::Response& resp)
        {
            std::string question_number = req.matches[1]; //拿到题目编号
            std::string html;
            ctrl.Question_Message(question_number, html);
            resp.set_content(html, "text/html;charset=utf-8");
        }
    );
    // 3. 提交代码，使用判题功能
    server.Post
    (
        R"(/judge/(\d+))",
        [&ctrl](const httplib::Request& req, httplib::Response& resp)
        {
            // std::cout << "识别请求成功，用户需要提交数据" << std::endl;
            std::string question_number = req.matches[1];
            std::string result_json;
            
            ctrl.Result(question_number, req.body, result_json);
            resp.set_content(result_json, "application/json;charset=utf-8");
        }
    );

    // 4. 获取首页信息 -> 设置首页 (这里就是设置根目录)
    server.set_base_dir("./wwwroot");
    // 监听浏览器请求
    server.listen("0.0.0.0", 8080);
    return 0;
}
